package com.shanxia.codec.cmd;

import com.shanxia.codec.ProtocolDataBase;
import com.shanxia.codec.enums.*;
import lombok.Data;

import java.math.BigDecimal;
import java.util.Arrays;

import static com.shanxia.codec.CodeConstant.*;
import static com.shanxia.codec.Decoder.*;

/**
 * 充电桩上报 BMS 信息
 */
@Data
public class Cmd302 extends ProtocolDataBase {

    public static final int MIN_SIZE = 195;

    private int v1;
    private int v2;
    private int orderCount;                                             // 报文次序计数
    private int pileNum;                                                // 充电枪号
    private String sn;                                                  // 充电桩编码
    private int workingStatus;                                          // 工作状态
    private int carConnStatus;                                          // 车连接状态
    private String commuVer;                                            // BRM-BMS 通讯协议版本号
    private BatteryTypeEnum batteryType;                                // BR-电池类型
    private double ratedCapacity;                                       // BRM-整车动力蓄电池 系统额定容量/Ah
    private double ratedVol;                                            // BRM-整车动力蓄电池 系统额定总电压/V
    private int manufacturer;                                           // BRM-电池生产厂商
    private int groupSerialNum;                                         // BRM-电池组序号
    private String dateOfManufacture;                                   // BRM-电池组生厂日期
    private int chargingCount;                                          // BRM-电池组充电次数
    private int propRightSign;                                          // BRM-电池组产权标识
    private int v3;
    private String vin;                                                 // BRM-车辆识别码 vin
    private int softwareVer;                                            // BRM-BMS 软件版本号
    private String softwareVerDate;                                     // BRM-BMS 软件版本号日期
    private double maxChargingVol;                                      // BCP-单体动力蓄电池最高允许充电电压
    private double maxChargingCurrent;                                  // BCP-最高允许充电电 流
    private double maxTotalEnergy;                                      // BCP-动力蓄电池标称 总能量
    private double maxTotalChargingVol;                                 // BCP-最高允许充电总 电压
    private int maxTempe;                                               // BCP-最高允许温度
    private double loadStatus;                                          // BCP-整车动力蓄电池 荷电状态
    private double currentVol;                                          // BCP-整车动力蓄电池 当前电池电压
    private ChargingPreparationEnum chargingPreparation;                // BRO-BMS 是否充电准备 好
    private double volRequirement;                                      // BCL-电压需求
    private double currentRequirement;                                  // BCL-电流需求
    public ChargingPatternEnum chargingPattern;                         // BCL-充电模式
    private double chargingVol;                                         // BCS-充电电压测量值
    private double chargingCurrent;                                     // BCS-充电电流测量值
    private double singleMaxVol;                                        // BCS-最高单体动力蓄 电池电压
    private double singleMaxGroupNum;                                   // BCS-最高单体动力蓄 电池组号
    private int curSoc;                                                 // BCS-当前荷电状态 soc%
    private int remainingTime;                                          // 估算剩余充电时间
    private int singleMaxVolNum;                                        // BSM-最高单体动力蓄电池电压所在编号
    private int maxBatteryTempe;                                        // BSM-最高动力蓄电池 温度
    private int maxBatteryTempeNum;                                     // BSM-最高温度检测点 编号
    private int minBatteryTempe;                                        // BSM-最低动力蓄电池 温度
    private int minBatteryTempeNum;                                     // BSM-最低动力蓄电池 温度检测点编号
    private BatteryVolStatusEnum batteryVolStatus;                      // BSM-单体动力蓄电池 电压过高或过低
    private BatteryLoadStatusEnum batteryLoadStatus;                    // BSM-整车动力蓄电池 荷电状态 soc 过高或过 低
    private BatteryCurrentStatusEnum batteryCurrentStatus;              // BSM-动力蓄电池充电 过电流
    private BatteryTempeStatusEnum batteryTempeStatus;                  // BSM-动力蓄电池温度 过高
    private BatteryIsolationStatusEnum batteryIsolationStatus;          // BSM-动力蓄电池绝缘 状态
    private BatteryGroupConnectorStatusEnum batteryGroupConnectorStatus;// BSM-动力蓄电池组输 出连接器连接状态
    private ChargingPermissionEnum chargingPermission;                  // BSM-允许充电
    private SocGoalEnum socGoal;                                        // BST-BMS 达到所需求的 SOC 目标值
    private TotalVolGoalEnum totalVolGoal;                              // BST-BMS 达到总电压的 设定值
    private SingleVolGoalEnum singleVolGoal;                            // BST-达到单体电压的设定值
    private InitiativeStopEnum initiativeStop;                          // BST-充电机主动终止
    private FaultStatusEnum isolationFault;                             // BST-绝缘故障
    private FaultStatusEnum outputConnectorOverheatFault;               // BST-输出连接器过温 故障
    private FaultStatusEnum bmsOutputConnectorOverheatFault;            // BST-BMS 元件，输出连 接器过温
    private FaultStatusEnum chargingConnectorFault;                     // BST-充电连接器故障
    private FaultStatusEnum batteryGroupOverheatFault;                  // BST-电池组温度过高 故障
    private FaultStatusEnum relayFault;                                 // BST-高压继电器故障
    private FaultStatusEnum volCheckFault;                              // BST-检测点 2 电压检测 故障
    private FaultStatusEnum otherFault;                                 // BST-其他故障
    private BatteryCurrentTooHighEnum batteryCurrentTooHigh;            // BST-电流过大
    private BatteryVolExceptionEnum batteryVolException;                // BST-电压异常
    private int stopLoadStatus;                                         // BSD-终止荷电状态 soc
    private double bsdSingleMinVol;                                     // BSD-动力蓄电池单体 最低电压
    private double bsdSingleMaxVol;                                     // BSD-动力蓄电池单体 最高电压
    private int bsdMinTempe;                                            // BSD-动力蓄电池最低 温度
    private int bsdMaxTempe;                                            // BSD-动力蓄电池最高 温度
    private MsgOvertimeStatusEnum SNP2560_0x00_Status;                  // BEM-接收 SPN2560=0x00 的充电 机辨识报文超时
    private MsgOvertimeStatusEnum SNP2560_0xAA_Status;                  // BEM-接收 SPN2560=0xaa 的充电 机辨识报文超时
    private MsgOvertimeStatusEnum timeSyncAndMaxoutputStatus;           // BEM-接收充电机的时 间同步和最大输出能 力报文超时
    private MsgOvertimeStatusEnum finishChargingPrepareStatus;          // BEM-接收充电机完成 充电准备报文超时
    private MsgOvertimeStatusEnum chargingStatus;                       // BEM-接收充电机充电 状态报文超时
    private MsgOvertimeStatusEnum stopChargingStatus;                   // BEM-接收充电机终止 充电报文超时
    private MsgOvertimeStatusEnum chargingStatisticsStatus;             // BEM-接收充电机充电 统计报文超时
    private int other;                                                  // BEM-其他

    public Cmd302(){
        super.setCmd(302);
    }

    public static Cmd302 decodeFromBase(ProtocolDataBase protocolDataBase) {
        Cmd302 cmd = new Cmd302();
        cmd.copyDataFrom(protocolDataBase);
        byte[] dataField = protocolDataBase.getDataField();
        if (dataField.length < MIN_SIZE) {
            cmd.setResult(DecodeEnum.InvalidData);
            return cmd;
        }
        int offset = 0;
        cmd.v1 = getUint16(dataField, offset);
        offset += 2;
        cmd.v2 = getUint16(dataField, offset);
        offset += 2;
        // 2字节报文次序计数
        cmd.orderCount = getUint16(dataField, offset);
        offset += 2;
        // 2字节充电枪号
        cmd.pileNum = getUint16(dataField, offset);
        offset += 2;
        // 32字节充电桩编码
        cmd.sn = byteToAscii(Arrays.copyOfRange(dataField, offset, offset + 32), true);
        offset += 32;
        // 1字节工作状态
        cmd.workingStatus = getUint8(dataField[offset++]);
        // 1字节车连接状态
        cmd.carConnStatus = getUint8(dataField[offset++]);
        // 3字节BRM-BMS 通讯协议版本号
        getUint8(dataField[offset++]);  // 第一字节为预留
        int mainVer = getUint8(dataField[offset++]);
        int subVer = getUint8(dataField[offset++]);
        cmd.commuVer = mainVer + "." + subVer;
        // 1字节BRM-电池类型
        cmd.batteryType = BatteryTypeEnum.getByCode(getUint8(dataField[offset++]));
        // 4字节BRM-整车动力蓄电池系统额定容量/Ah
        cmd.ratedCapacity = new BigDecimal(getInt32(dataField, offset)).multiply(TENTH).doubleValue();
        offset += 4;
        // 4字节BRM-整车动力蓄电池系统额定总电压/V
        cmd.ratedVol = new BigDecimal(getInt32(dataField, offset)).multiply(TENTH).doubleValue();
        offset += 4;
        // 4字节BRM-电池生产厂商
        cmd.manufacturer = getInt32(dataField, offset);
        offset += 4;
        // 4字节BRM-电池组序号，预留
        cmd.groupSerialNum = getInt32(dataField, offset);
        offset += 4;
        // 2字节BRM-电池组生厂日期：年
        // 1字节BRM-电池组生厂日期：月
        // 1字节BRM-电池组生厂日期：日
        String year = String.valueOf(getUint16(dataField, offset));
        offset += 2;
        int intMonth = getUint8(dataField[offset++]);
        String month = intMonth < 10 ? "0" + intMonth : String.valueOf(intMonth);
        int intDay = getUint8(dataField[offset++]);
        String day = intDay < 10 ? "0" + intDay : String.valueOf(intDay);
        cmd.dateOfManufacture = year + "-" + month + "-" + day;
        // 4字节BRM-电池组充电次数
        cmd.chargingCount = getInt32(dataField, offset);
        offset += 4;
        // 1字节BRM-电池组产权标识
        cmd.propRightSign = getUint8(dataField[offset++]);
        // 1字节预留
        cmd.v3 = getUint8(dataField[offset++]);
        // 17字节BRM-车辆识别码 vin
        cmd.vin = byteToAscii(Arrays.copyOfRange(dataField, offset, offset + 17), true);
        offset += 17;
        // 8字节BRM-BMS 软件版本号
        // Byte1 表示版本流水号, byte2 表示日, byte3, byte4 和 byte5 表示年, byte6,7,8预留
        cmd.softwareVer = getUint8(dataField[offset]);
        int intSoftVerDay = getUint8(dataField[offset + 1]);
        int intSoftVerMonth = getUint8(dataField[offset + 2]);
        int intSoftVerYear = getUint16(dataField, offset + 3);
        cmd.softwareVerDate = intSoftVerYear + "-" +
                (intSoftVerMonth < 10 ? "0" + intSoftVerMonth : intSoftVerMonth) + "-" +
                (intSoftVerDay < 10 ? "0" + intSoftVerDay : intSoftVerDay);
        offset += 8;
        // 4字节BCP-单体动力蓄电池最高允许充电电压
        cmd.maxChargingVol = new BigDecimal(getInt32(dataField, offset)).multiply(TENTH).doubleValue();
        offset += 4;
        // 4字节BCP-最高允许充电电流
        cmd.maxChargingCurrent = new BigDecimal(getInt32(dataField, offset)).multiply(TENTH).doubleValue();;
        offset += 4;
        // 4字节BCP-动力蓄电池标称总能量
        cmd.maxTotalEnergy = new BigDecimal(getInt32(dataField, offset)).multiply(TENTH).doubleValue();
        offset += 4;
        // 4字节BCP-最高允许充电总电压
        cmd.maxTotalChargingVol = new BigDecimal(getInt32(dataField, offset)).multiply(TENTH).doubleValue();;
        offset += 4;
        // 1字节BCP-最高允许温度
        cmd.maxTempe = getUint8(dataField[offset++]) + TEMPE_OFFSET;
        // 2字节BCP-整车动力蓄电池荷电状态
        cmd.loadStatus = new BigDecimal(getUint16(dataField, offset)).multiply(TENTH).doubleValue();
        offset += 2;
        // 4字节BCP-整车动力蓄电池当前电池电压
        cmd.currentVol = new BigDecimal(getInt32(dataField, offset)).multiply(TENTH).doubleValue();
        offset += 4;
        // 1字节BRO-BMS 是否充电准备 好
        cmd.chargingPreparation = ChargingPreparationEnum.getByCode(getUint8(dataField[offset++]));
        // 4字节BCL-电压需求
        cmd.volRequirement = new BigDecimal(getInt32(dataField, offset)).multiply(TENTH).doubleValue();
        offset += 4;
        // 4字节BCL-电流需求
        cmd.currentRequirement = new BigDecimal(getInt32(dataField, offset)).multiply(TENTH).doubleValue();
        offset += 4;
        // 1字节充电模式
        cmd.chargingPattern = ChargingPatternEnum.getByCode(getUint8(dataField[offset++]));
        // 4字节BCS-充电电压测量值
        cmd.chargingVol = new BigDecimal(getInt32(dataField, offset)).multiply(TENTH).doubleValue();
        offset += 4;
        // 4字节BCS-充电电流测量值
        cmd.chargingCurrent = new BigDecimal(getInt32(dataField, offset)).multiply(TENTH).doubleValue();
        offset += 4;
        // 4字节BCS-最高单体动力蓄电池电压
        cmd.singleMaxVol = new BigDecimal(getInt32(dataField, offset)).multiply(PERCENT).doubleValue();
        offset += 4;
        // 1字节BCS-最高单体动力蓄 电池组号
        cmd.singleMaxGroupNum = getUint8(dataField[offset++]);
        // 2字节BCS-当前荷电状态 soc%
        cmd.curSoc = getUint16(dataField, offset);
        offset += 2;
        // 4字节估算剩余充电时间
        cmd.remainingTime = getInt32(dataField, offset);
        offset += 4;
        // 1字节BSM-最高单体动力蓄电池电压所在编号
        cmd.singleMaxVolNum = getUint8(dataField[offset++]);
        // 1字节BSM-最高动力蓄电池温度
        cmd.maxBatteryTempe = getUint8(dataField[offset++]);
        // 1字节BSM-最高温度检测点 编号
        cmd.maxBatteryTempeNum = getUint8(dataField[offset++]);
        // 1字节BSM-最低动力蓄电池 温度
        cmd.minBatteryTempe = getUint8(dataField[offset++]);
        // 1字节BSM-最低动力蓄电池 温度检测点编号
        cmd.minBatteryTempeNum = getUint8(dataField[offset++]);
        // 1字节BSM-单体动力蓄电池 电压过高或过低
        cmd.batteryVolStatus = BatteryVolStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1BSM-整车动力蓄电池 荷电状态 soc 过高或过低
        cmd.batteryLoadStatus = BatteryLoadStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BSM-动力蓄电池充电 过电流
        cmd.batteryCurrentStatus = BatteryCurrentStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BSM-动力蓄电池温度 过高
        cmd.batteryTempeStatus = BatteryTempeStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BSM-动力蓄电池绝缘 状态
        cmd.batteryIsolationStatus = BatteryIsolationStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BSM-动力蓄电池组输 出连接器连接状态
        cmd.batteryGroupConnectorStatus = BatteryGroupConnectorStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BSM-允许充电
        cmd.chargingPermission = ChargingPermissionEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-BMS 达到所需求的 SOC 目标值
        cmd.socGoal = SocGoalEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-BMS 达到总电压的 设定值
        cmd.totalVolGoal = TotalVolGoalEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-达到单体电压的设定值
        cmd.singleVolGoal = SingleVolGoalEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-充电机主动终止
        cmd.initiativeStop = InitiativeStopEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-绝缘故障
        cmd.isolationFault = FaultStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-输出连接器过温 故障
        cmd.outputConnectorOverheatFault = FaultStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-BMS 元件，输出连 接器过温
        cmd.bmsOutputConnectorOverheatFault = FaultStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-充电连接器故障
        cmd.chargingConnectorFault = FaultStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-电池组温度过高 故障
        cmd.batteryGroupOverheatFault = FaultStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-高压继电器故障
        cmd.relayFault = FaultStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-检测点 2 电压检测 故障
        cmd.volCheckFault = FaultStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-其他故障
        cmd.otherFault = FaultStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-电流过大
        cmd.batteryCurrentTooHigh = BatteryCurrentTooHighEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BST-电压异常
        cmd.batteryVolException = BatteryVolExceptionEnum.getByCode(getUint8(dataField[offset++]));
        // 2字节BSD-终止荷电状态 soc
        cmd.stopLoadStatus = getUint16(dataField, offset);
        offset += 2;
        // 4字节BSD-动力蓄电池单体 最低电压
        cmd.bsdSingleMinVol = new BigDecimal(getInt32(dataField, offset)).multiply(PERCENT).doubleValue();;
        offset += 4;
        // 4字节BSD-动力蓄电池单体 最高电压
        cmd.bsdSingleMaxVol = new BigDecimal(getInt32(dataField, offset)).multiply(PERCENT).doubleValue();;
        offset += 4;
        // 1字节BSD-动力蓄电池最低 温度
        cmd.bsdMinTempe = getUint8(dataField[offset++]) + TEMPE_OFFSET;
        // 1字节BSD-动力蓄电池最高 温度
        cmd.bsdMaxTempe = getUint8(dataField[offset++]) + TEMPE_OFFSET;
        // 1字节BEM-接收 SPN2560=0x00 的充电 机辨识报文超时
        cmd.SNP2560_0x00_Status = MsgOvertimeStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BEM-接收 SPN2560=0xaa 的充电 机辨识报文超时
        cmd.SNP2560_0xAA_Status = MsgOvertimeStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BEM-接收充电机的时 间同步和最大输出能 力报文超时
        cmd.timeSyncAndMaxoutputStatus = MsgOvertimeStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BEM-接收充电机完成 充电准备报文超时
        cmd.finishChargingPrepareStatus = MsgOvertimeStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BEM-接收充电机充电 状态报文超时
        cmd.chargingStatus = MsgOvertimeStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BEM-接收充电机终止 充电报文超时
        cmd.stopChargingStatus = MsgOvertimeStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BEM-接收充电机充电 统计报文超时
        cmd.chargingStatisticsStatus = MsgOvertimeStatusEnum.getByCode(getUint8(dataField[offset++]));
        // 1字节BEM-其他
        cmd.other = getUint8(dataField[offset++]);
        return cmd;
    }

    @Override
    public String toString() {

        StringBuffer buffer = new StringBuffer();
        buffer.append("#cmd302#").append("\n");
        buffer.append("v1:").append(v1).append("\n");
        buffer.append("v2:").append(v2).append("\n");
        buffer.append("v3:").append(v3).append("\n");
        buffer.append("充电桩编码:").append(sn).append("\n");
        buffer.append("充电枪号:").append(pileNum).append("\n");
        buffer.append("车辆VIN码:").append(vin).append("\n");
        buffer.append("报文次序计数:").append(orderCount).append("\n");                                             //
        buffer.append("工作状态:").append(workingStatus).append("\n");                                          //
        buffer.append("车连接状态:").append(carConnStatus).append("\n");                                          //
        buffer.append("BRM-BMS 通讯协议版本号:").append(commuVer).append("\n");                                            //
        buffer.append("BR-电池类型:").append(batteryType).append("\n");                                //
        buffer.append("BRM-整车动力蓄电池 系统额定容量/Ah:").append(ratedCapacity).append("\n");                                       //
        buffer.append("BRM-整车动力蓄电池 系统额定总电压/V:").append(ratedVol).append("\n");                                            //
        buffer.append("BRM-电池生产厂商:").append(manufacturer).append("\n");                                           //
        buffer.append("BRM-电池组序号:").append(groupSerialNum).append("\n");                                         //
        buffer.append("BRM-电池组生厂日期:").append(dateOfManufacture).append("\n");                                   //
        buffer.append("BRM-电池组充电次数:").append(chargingCount).append("\n");                                          //
        buffer.append("BRM-电池组产权标识:").append(propRightSign).append("\n");                                          //
        buffer.append("BRM-BMS 软件版本号:").append(softwareVer).append("\n");                                            //
        buffer.append("BRM-BMS 软件版本号日期:").append(softwareVerDate).append("\n");                                     //
        buffer.append("BCP-单体动力蓄电池最高允许充电电压:").append(maxChargingVol).append("\n");                                      //
        buffer.append("BCP-最高允许充电电 流:").append(maxChargingCurrent).append("\n");                                  //
        buffer.append("BCP-动力蓄电池标称 总能量:").append(maxTotalEnergy).append("\n");                                      //
        buffer.append("BCP-最高允许充电总 电压:").append(maxTotalChargingVol).append("\n");                                 //
        buffer.append("BCP-最高允许温度:").append(maxTempe).append("\n");                                               //
        buffer.append("BCP-整车动力蓄电池 荷电状态:").append(loadStatus).append("\n");                                          //
        buffer.append("BCP-整车动力蓄电池 当前电池电压:").append(currentVol).append("\n");                                          //
        buffer.append("BRO-BMS 是否充电准备 好:").append(chargingPreparation).append("\n");                //
        buffer.append("BCL-电压需求:").append(volRequirement).append("\n");                                      //
        buffer.append("BCL-电流需求:").append(currentRequirement).append("\n");                                  //
        buffer.append("BCL-充电模式:").append(chargingPattern.name).append("\n");                         //
        buffer.append("BCS-充电电压测量值:").append(chargingVol).append("\n");                                         //
        buffer.append("BCS-充电电流测量值:").append(chargingCurrent).append("\n");                                     //
        buffer.append("BCS-最高单体动力蓄 电池电压:").append(singleMaxVol).append("\n");                                        //
        buffer.append("BCS-最高单体动力蓄 电池组号:").append(singleMaxGroupNum).append("\n");                                   //
        buffer.append("BCS-当前荷电状态 soc%:").append(curSoc).append("\n");                                                 //
        buffer.append("估算剩余充电时间:").append(remainingTime).append("\n");                                          //
        buffer.append("BSM-最高单体动力蓄电池电压所在编号:").append(singleMaxVolNum).append("\n");                                        //
        buffer.append("BSM-最高动力蓄电池 温度:").append(maxBatteryTempe).append("\n");                                        //
        buffer.append("BSM-最高温度检测点 编号:").append(maxBatteryTempeNum).append("\n");                                     //
        buffer.append("BSM-最低动力蓄电池 温度:").append(minBatteryTempe).append("\n");                                        //
        buffer.append("BSM-最低动力蓄电池 温度检测点编号:").append(minBatteryTempeNum).append("\n");                                     //
        buffer.append("BSM-单体动力蓄电池 电压过高或过低:").append(batteryVolStatus.name).append("\n");                      //
        buffer.append("BSM-整车动力蓄电池 荷电状态 soc 过高或过 低:").append(batteryLoadStatus.name).append("\n");                    //
        buffer.append("BSM-动力蓄电池充电 过电流:").append(batteryCurrentStatus.name).append("\n");              //
        buffer.append("BSM-动力蓄电池温度 过高:").append(batteryTempeStatus.name).append("\n");                  //
        buffer.append("BSM-动力蓄电池绝缘 状态:").append(batteryIsolationStatus.name).append("\n");          //
        buffer.append("BSM-动力蓄电池组输 出连接器连接状态:").append(batteryGroupConnectorStatus.name).append("\n");//
        buffer.append("BSM-允许充电:").append(chargingPermission).append("\n");                  //
        buffer.append("BST-BMS 达到所需求的 SOC 目标值:").append(socGoal).append("\n");                                        //
        buffer.append("BST-BMS 达到总电压的 设定值:").append(totalVolGoal).append("\n");                              //
        buffer.append("BST-达到单体电压的设定值:").append(singleVolGoal).append("\n");                            //
        buffer.append("BST-充电机主动终止:").append(initiativeStop).append("\n");                          //
        buffer.append("BST-绝缘故障:").append(isolationFault.name).append("\n");                             //
        buffer.append("BST-输出连接器过温 故障:").append(outputConnectorOverheatFault.name).append("\n");               //
        buffer.append("BST-BMS 元件，输出连 接器过温:").append(bmsOutputConnectorOverheatFault.name).append("\n");            //
        buffer.append("BST-充电连接器故障:").append(chargingConnectorFault.name).append("\n");                     //
        buffer.append("BST-电池组温度过高 故障:").append(batteryGroupOverheatFault.name).append("\n");                  //
        buffer.append("BST-高压继电器故障:").append(relayFault.name).append("\n");                                 //
        buffer.append("BST-检测点 2 电压检测 故障:").append(volCheckFault.name).append("\n");                              //
        buffer.append("BST-其他故障:").append(otherFault.name).append("\n");                                 //
        buffer.append("BST-电流过大:").append(batteryCurrentTooHigh).append("\n");            //
        buffer.append("BST-电压异常:").append(batteryVolException).append("\n");                //
        buffer.append("BSD-终止荷电状态 soc:").append(stopLoadStatus).append("\n");                                         //
        buffer.append("BSD-动力蓄电池单体 最低电压:").append(bsdSingleMinVol).append("\n");                                     //
        buffer.append("BSD-动力蓄电池单体 最高电压:").append(bsdSingleMaxVol).append("\n");                                     //
        buffer.append("BSD-动力蓄电池最低 温度:").append(bsdMinTempe).append("\n");                                            //
        buffer.append("BSD-动力蓄电池最高 温度:").append(bsdMaxTempe).append("\n");                                            //
        buffer.append("BEM-接收 SPN2560=0x00 的充电 机辨识报文超时").append(SNP2560_0x00_Status.name).append("\n");                  //
        buffer.append("BEM-接收 SPN2560=0xaa 的充电 机辨识报文超:").append(SNP2560_0xAA_Status.name).append("\n");                  // 时
        buffer.append("BEM-接收充电机的时 间同步和最大输出能 力报文超时:").append(timeSyncAndMaxoutputStatus.name).append("\n");           //
        buffer.append("BEM-接收充电机完成 充电准备报文超时:").append(finishChargingPrepareStatus.name).append("\n");          //
        buffer.append("BEM-接收充电机充电 状态报文超时:").append(chargingStatus.name).append("\n");                       //
        buffer.append("BEM-接收充电机终止 充电报文超时:").append(stopChargingStatus.name).append("\n");                   //
        buffer.append("BEM-接收充电机充电 统计报文超时:").append(chargingStatisticsStatus.name).append("\n");             //
        buffer.append("BEM-其他:").append(other).append("\n");                                                  //
        return buffer.toString();
    }
}
